package com.hyf.java_example.collection;


import org.junit.Test;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 集合类的相关，添加方法之后在这里写上注释
 *
 * CopyOnWriteArrayList 集合
 * 可以看源码  适合场景多线程下读的操作 多余 写操作的情况
 * 但是需要注意内存，因为写操作（写的时候有加锁操作）是将当前集合赋值给个引用，然后在创建一个新的数组，
 * 在新的数组添加元素在赋值
 */
public class CollectionExample {


    @Test
    public static void t1(){

        //ArrayList 和Vector 在这样的场景下都会出错  只有CopyOnWriteArrayList 可以因为实现机制不一样
        final List<Integer> list=new CopyOnWriteArrayList<Integer>();
        for(int i=0;i<5;i++){
            list.add(i);
        }
        //测试2个线程同时操作集合  一个线程遍历元素，一个线程删除集合中的一个元素
        new Thread(new Runnable() {
            public void run() {
                for(int i:list){
                    System.out.println("i:"+i);
                    //防着遍历太快看不出效果来
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                //另一种遍历方式
               /* for(int i=0;i<list.size();i++){
                    //防着遍历太快看不出效果来
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("i:"+list.get(i));

                }*/
            }
        }).start();


        new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                list.remove(0);
                System.out.println("list.remove(4)");
            }
        }).start();

    }

    public static void main(String[] args){
        t1();
    }
}
